package com.kun.companion.core.ui.list;

import com.kun.companion.core.ui.KunComponent;
import javafx.collections.ObservableList;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.util.Callback;

/**
 * 增强型列表视图基类，提供高性能渲染和扩展支持
 *
 * <h2>设计目标：</h2>
 * <ul>
 *   <li>通过单元格复用机制实现高性能渲染</li>
 *   <li>内置现代化样式模板，支持动态样式扩展</li>
 *   <li>提供标准化的数据绑定接口</li>
 *   <li>支持单元格生命周期管理</li>
 * </ul>
 *
 * <h2>扩展点：</h2>
 * <ol>
 *   <li>样式扩展 - 重写{@link BaseListCell#initStyle()}方法</li>
 *   <li>数据绑定 - 重写{@link BaseListCell#bindData(Object)}方法</li>
 *   <li>布局定制 - 重写{@link BaseListCell#updateLayout()}方法</li>
 *   <li>状态管理 - 通过selectedProperty/hoverProperty等Observable状态</li>
 * </ol>
 *
 * <h2>运行逻辑：</h2>
 * 1. 虚拟滚动容器自动回收不可见单元格 → 2. 触发单元格更新时优先使用缓存 → 3. 应用样式模板 →
 * 4. 绑定数据到UI组件 → 5. 根据状态更新视觉表现 → 6. 回收时自动解绑资源
 *
 * @author gzc
 * @param <T> 列表项数据类型
 */
public class BaseListView<T> extends ListView<T> implements KunComponent {

    public BaseListView() {
        super();
        setBaseListCell(new BaseListCell<>());
    }

    public BaseListView(ObservableList<T> items) {
        super(items);
        setBaseListCell(new BaseListCell<>());
    }

    public BaseListView(Callback<ListView<T>, ListCell<T>> value) {
        super();
        setCellFactory(value);
    }

    public void setBaseListCell(BaseListCell<T> baseListCell) {
        getStyleClass().add("kun-list-view");
        getStylesheets().add("/com/kun/companion/css/kun-list-view.css");
        setCellFactory(lv -> {
            // 固定高度提升性能
            baseListCell.setPrefHeight(Integer.MAX_VALUE);
            return baseListCell;
        });
        // 启用固定单元格大小优化
        setFixedCellSize(60);
    }

    @Override
    public void dispose() {
        // 释放资源
        getItems().clear();
        setCellFactory(null);
        setItems(null);
        // 关闭不必要的动画
        getStyleClass().add("no-animation");
        setStyle("-fx-animation-duration: 0;");
    }
}
